package leetcode;

public class Leetcode98 {
    public boolean isValidBST(TreeNode root) {
        if(root == null){
            return true;
        }
        if(!isValidBST(root.left)||!isValidBST(root.right)){//左右只要一个不是搜索树，返回false
            return false;
        }
        if(root.left!=null&&root.left.val>=root.val){//左边大于等于右边，返回false
            return false;
        }
        if(root.right!=null&&root.right.val<=root.val){//右边大于等于左边，返回false
            return false;
        }
        if(root.left!=null&&righthelper(root.left).val>=root.val){//左子树的最右叶节点大于等于根，返回false
            return false;
        }
        if(root.right!=null&&lefthelper(root.right).val<=root.val){//右子树的最左叶节点大于等于根，返回false
            return false;
        }
        return true;
    }
    public TreeNode lefthelper(TreeNode root){//遍历
        while(root.left!=null){
            root = root.left;
        }
        return root;
    }
    public TreeNode righthelper(TreeNode root){//遍历
        while(root.right!=null){
            root = root.right;
        }
        return root;
    }

    //中序遍历
    long pre = Long.MIN_VALUE;
    public boolean isValidBST1(TreeNode root) {
        if (root == null) {
            return true;
        }
        // 访问左子树
        if (!isValidBST(root.left)) {
            return false;
        }
        // 访问当前节点：如果当前节点小于等于中序遍历的前一个节点，说明不满足BST，返回 false；否则继续遍历。
        if (root.val <= pre) {
            return false;
        }
        pre = root.val;
        // 访问右子树
        return isValidBST(root.right);
    }
}
